import Vue from 'vue'
import { axios } from '@/utils/request'
import qs from 'qs'

const api = {
  user: '/api/user',
  role: '/api/role',
  service: '/api/service',
  permission: '/api/permission',
  permissionNoPager: '/api/permission/no-pager'
}

export default api

//post
export function postAction(url, parameter, isForm, isMulti) {
  if (isForm) {
    if (isForm) {
      if (!isMulti) {
        return axios({
          headers: {
            'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
          },
          url: url,
          method: 'post',
          data: qs.stringify(parameter)
        })
      } else {
        return axios({
          headers: {
            'Content-Type': 'multiple/form-data;charset=utf-8'
          },
          url: url,
          method: 'post',
          data: qs.stringify(parameter)
        })
      }
    }
  } else {
    return axios({
      url: url,
      method: 'post',
      data: parameter
    })
  }
}

//post method= {post | put}
export function httpAction(url, parameter, method, type) {
  return axios({
    url: url,
    method: method,
    data: parameter,
    type: type
  })
}

//put
export function putAction(url, parameter, isForm, isMulti) {
  if (isForm) {
    if (isForm) {
      if (!isMulti) {
        return axios({
          headers: {
            'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
          },
          url: url,
          method: 'put',
          data: qs.stringify(parameter)
        })
      } else {
        return axios({
          headers: {
            'Content-Type': 'multiple/form-data;charset=utf-8'
          },
          url: url,
          method: 'put',
          data: qs.stringify(parameter)
        })
      }
    }
  } else {
    return axios({
      url: url,
      method: 'put',
      data: parameter
    })
  }
}

//get
export function getAction(url, parameter) {
  return axios({
    url: url,
    method: 'get',
    params: parameter
  })
}

//deleteAction
export function deleteAction(url, parameter, type) {
  return axios({
    url: url,
    method: 'delete',
    params: parameter,
    type: type
  })
}

export function getUserList(parameter) {
  return axios({
    url: api.user,
    method: 'get',
    params: parameter
  })
}

export function getRoleList(parameter) {
  return axios({
    url: api.role,
    method: 'get',
    params: parameter
  })
}

export function getServiceList(parameter) {
  return axios({
    url: api.service,
    method: 'get',
    params: parameter
  })
}

export function getPermissions(parameter) {
  return axios({
    url: api.permissionNoPager,
    method: 'get',
    params: parameter
  })
}

// id == 0 add     post
// id != 0 update  put
export function saveService(parameter) {
  return axios({
    url: api.service,
    method: parameter.id == 0 ? 'post' : 'put',
    data: parameter
  })
}

/**
 * 下载文件 用于excel导出
 * @param url
 * @param parameter
 * @returns {*}
 */
export function downFile(url, parameter) {
  return axios({
    url: url,
    params: parameter,
    method: 'get',
    responseType: 'blob'
  })
}

/**
 * 同步下载文件
 * @param url 文件路径
 * @param fileName 文件名
 * @param parameter
 * @returns {*}
 */
export function syncDownloadFile(url, fileName, parameter) {
  return downFile(url, parameter).then((data) => {
    if (!data || data.size === 0) {
      Vue.prototype['$message'].warning('文件下载失败')
      return
    }
    if (typeof window.navigator.msSaveBlob !== 'undefined') {
      window.navigator.msSaveBlob(new Blob([data]), fileName)
    } else {
      let url = window.URL.createObjectURL(new Blob([data]))
      let link = document.createElement('a')
      link.style.display = 'none'
      link.href = url
      link.setAttribute('download', fileName)
      document.body.appendChild(link)
      link.click()
      document.body.removeChild(link) //下载完成移除元素
      window.URL.revokeObjectURL(url) //释放掉blob对象
    }
  })
}

/**
 * 异步下载文件
 * @param res 上一流程的回调参数
 * @param callback 回调函数
 */
export function asyncDownloadFile(res, callback) {
  const disposition = res.headers['content-disposition'];
  // 拿到文件名
  let filename = disposition.split('filename=')[1];
  let blob = new Blob([res.data], { type: 'application/zip' });
  // 兼容ie
  if ('msSaveOrOpenBlob' in navigator) {
    window.navigator.msSaveOrOpenBlob(blob, filename);
  } else {
    const URL = window.URL || window.webkitURL;
    let objectUrl = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = objectUrl;
    a.download = filename;
    a.click();
    URL.revokeObjectURL(objectUrl);
  }
  callback && callback();
}

/**
 * 文件上传 用于富文本上传图片
 * @param url
 * @param parameter
 * @returns {*}
 */
export function uploadAction(url, parameter) {
  return axios({
    url: url,
    data: parameter,
    method: 'post',
    headers: {
      'Content-Type': 'multipart/form-data' // 文件上传
    }
  })
}

/**
 * 获取文件服务访问路径
 * @param avatar
 * @param subStr
 * @returns {*}
 */
export function getFileAccessHttpUrl(avatar, subStr) {
  if (!subStr) subStr = 'http'
  if (avatar && avatar.startsWith(subStr)) {
    return avatar;
  } else {
    if (avatar &&　avatar.length > 0 && avatar.indexOf('[') == -1) {
      return window._CONFIG['staticDomainURL'] + "/" + avatar;
    }
  }
}
